package com.longe.util;

import io.jsonwebtoken.Claims;
import io.jsonwebtoken.JwtBuilder;
import io.jsonwebtoken.Jwts;
import io.jsonwebtoken.SignatureAlgorithm;
import lombok.Data;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.stereotype.Component;

import java.util.Date;
import java.util.Map;

@Data
@Component
@ConfigurationProperties(prefix = "jwt.config")
public class JwtUtil {

    //签名私钥
    private String signKey;

    //存活时间,单位毫秒
    private long ttl;

    /**
     * 签发 token
     */
    public String createJWT(String id, String subject,Map<String,Object> map){

        long now = System.currentTimeMillis();
        long expire = now + ttl;
        JwtBuilder jwtBuilder = Jwts.builder()
                /**自定义属性的添加**/
                .setClaims(map)
                /**jwt的唯一标识，想填什么随意，不填也行**/
                .setId(id)
                /**subject为jwt提供的属性，想填什么随意，不填也行**/
                .setSubject(subject)
                /**jwt的签发时间，jwt提供的属性，不填也行**/
                .setIssuedAt(new Date())
                /**信息加密的方式及签名私钥，jwt提供的属性，不填也行**/
                .signWith(SignatureAlgorithm.HS256, signKey);
        if(ttl > 0){
            /**设置token的过期时间**/
            jwtBuilder.setExpiration(new Date(expire));
        }
        String token = jwtBuilder.compact();
        return token;
    }


   /** 解析JWT
    * @param token
    * @return
    */
    public Claims parseJWT(String token){

        Claims claims = null;
        try {
            claims = Jwts.parser()
                    .setSigningKey(signKey)
                    .parseClaimsJws(token)
                    .getBody();
        }catch (Exception e){
            e.getStackTrace();
        }
        return claims;
    }

}
